# -*- coding: utf-8 -*-

# 整理
# func在外面传入或者里面传入不影响是不是装饰器，返回的是wrapper就可以。
# 如果写在func写在里面，不调用也会执行原函数，比较奇怪。         #  后续了解
# 重点：所以需要写在外面，保证调用了才执行。

# 第一版   # 标准写法
def debug(func):
    def wrapper():
        print("[DEBUG]: enter {}()".format(func.__name__))
        return func()
    return wrapper

@debug
def now():
    print ("hello!")
now()


# 由于log()是一个decorator，返回一个函数，所以，原来的now()函数仍然存在，
# 只是现在同名的now变量指向了新的函数，于是调用now()将执行新函数，即在log()函数中返回的wrapper()函数。
# now = debug(now)  # 添加功能并保持原函数名不变
now(1)


#第二版
# def debug_2(code):
#     def wrapper(func):
#         print("[DEBUG]: enter {}()".format(func.__name__))
#         print(code)
#         return func
#     return wrapper
#
# @debug_2
# def say_hello_2():
#     print ("hello_2!")



# say_hello_2()

